package main

import (
	"fmt"
	"io/ioutil"
	"os"
	"path/filepath"
	"strings"
)

var matchCount = 0
var ch = make(chan int, 512)

func findFile(path string, text string) {
	var pathArray [100]string
	var count = 0
	var fileCount = 0
	filepath.Walk(path, func(path string, info os.FileInfo, err error) error {
		if err != nil {
		}
		//find text
		if !info.IsDir() {
			fileCount++
			// fmt.Printf("%200s %d bytes\n", info.Name(), info.Size())
			if info.Size() < 1024*1024*10 {
				pathArray[count] = path
				count++
				//每一百个执行任务
				if count >= 100 {
					count = 0
					go findText(pathArray[0:100], text)
					<-ch
				}
			}
		}
		return nil
	})
	//确保所有文件处理完成
	go findText(pathArray[0:count], text)
	<-ch

	fmt.Printf("总共有 %d 个文件\n", fileCount)
	fmt.Printf("一共发现了 %d 个匹配的文件\n", matchCount)

}

func findText(paths []string, text string) {

	for _, path := range paths {
		fi, err := os.Open(path)
		if err != nil {
			panic(err)
		}
		defer fi.Close()
		fd, err := ioutil.ReadAll(fi)
		if err != nil {
			panic(err)
		}

		if strings.Index(string(fd), text) > -1 {
			matchCount++
			fmt.Println(path)
		}
	}
	ch <- 1
}

func main() {
	args := os.Args
	if len(args) < 3 {
		fmt.Println("请输入 搜索路径 文件内容")
		return
	}
	path := args[1]
	text := args[2]

	_, err := os.Stat(path)

	if err != nil {
		fmt.Println("path不存在")
	} else {
		findFile(path, text)
	}
}
